
#ifndef  _DOWNLOADCENTER_H_
#define  _DOWNLOADCENTER_H_


// #import <Foundation/Foundation.h>
#include <stdio.h>

#include "cocos2d.h"
#include "httpClient.h"
#include "HttpNode.h"
#include "Define.h"
#include "MyObj.h"


USING_NS_CC;
using namespace std;



#define CMD_WAIT 0  // 子线程休眠命令
#define CMD_READ 1  // 子线程读Plist文件，为app启动时使用。
#define CMD_WRITE 2 // 子线程将最新的 dic 写入plist

#define SON_RUNNING true
#define SON_WAITING false



// 下载管理器
class DownLoadCenter: public Node
{
public:
    CREATE_FUNC(DownLoadCenter);
    bool init();

public:
    static DownLoadCenter *getInstance();
    void setWebName(std::string web);
    std::string getNowWebName();
    int getAllTaskNumber();

    // API
public:
    void setUpdateEvent(std::function<void(int allTasks, int finishedTasks )> evt);
    void loadDataToArray(__Array *ary);
    // 根据不用的网站名，或去对应的info。plist文件全路径。
    static std::string getInfoFilePathByName(std::string webName);
    // 根据不同网站名，和taskID，获取对应目录文件夹。
    static std::string getImgDocPath( std::string webName , int taskId);
    // 根据不同网站名，和taskID，获取对应目录文件夹。
    static std::string getImgFilePath( std::string webName , int taskId, int index);
    // 根据不同网站名，和taskID，获取对应目录文件夹。
    static std::string getNowWebImgDocPath( int taskId);
    // 根据不同网站名，和taskID，获取对应目录文件夹。
    static std::string getNowWebImgFilePath( int taskId, int index);


private:
    void autoRunWebTask();
    // 子线程的事情。
    void sonThreadFunc();
    // 自动吞吐几个（未完成和已完成）任务到 allDic 中。
    void autoGetSomeTaskFromCache();
    // 自动持续下载任务。
    void continueWebTask();
    // 读取
    void getPlistInfo_sonThread();
    // 自动通过子线程保存当前下载中的plist。
    void saveInfo_sonThread();

public:
    void setNowWebName(std::string webName);   // 很重要。网站标示。
    void addWebTasK(std::string taskURL);
    void setOneTaskFinishCallBack(std::function<void(int taskId, std::string &taskURL,OneTaskInfo &info)> func);
    void startRun();

    void oneTaskDownLoadFinish(int taskId, std::string taskURL, OneTaskInfo backInfo );
    void oneImageDownLoadFail(int taskId,  OneImageDownInfo *imgInfo);

private:
    std::function<void(int taskId, std::string &taskURL, OneTaskInfo &info)> oneTaskFinishedCallBack;
    std::function<void(int allTasks, int finishedTasks )> m_updateEvent;
    std::string m_webName;

    int m_allTaskNum;
    int m_downWebIndex;
    int m_sonThread_CMD;                // 子线程任务命令，在主线程中设置。
    bool m_sonThread_state;             // 子线程状态。
    HttpNode* m_taskHttpAry[N_WEB_TASK];       // 网页下载线程。

    MyArray *m_readyTask_cache;         // 准备下载的网页任务添加池
    MyArray *m_addTask_cache;           // 网页任务添加池
    MyArray *m_fixTask_cache;           // 内容有修改的任务池。
    MyDictionary *m_allDic;             // 总数据存储字典。
    MyDictionary *m_downOk_cache;       // 下载成功后临时存储字典。

};









#endif






